#pragma once
#include <iostream>
#include <string>
#include <sys/socket.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include<cstring>
#include<cstring>
using namespace std;
class inetaddr
{

public:
  // 网络序列转主机：
  inetaddr(sockaddr_in &addr) 
  {
    setinetaddr(addr);
   
  }
  // 客户端主机转网络：

  inetaddr(const string ip, uint16_t port) : _ip(ip), _port(port)
  {
    memset(&_addr, 0, sizeof(_addr));
    _addr.sin_family = AF_INET;
    inet_pton(AF_INET, _ip.c_str(), &_addr.sin_addr);
    _addr.sin_port = htons(_port);
  }
    void setinetaddr(sockaddr_in &addr){
      _addr=addr;
      _port = ntohs(addr.sin_port);
      char buff[1024];
      inet_ntop(AF_INET,&addr.sin_addr,buff,sizeof(addr));
      _ip=buff;
    }
  // 服务端主机转网络：
  inetaddr( uint16_t port) :  _port(port)
  {
    memset(&_addr, 0, sizeof(_addr));
    _addr.sin_family = AF_INET;
    inet_pton(AF_INET, _ip.c_str(), &_addr.sin_addr);
    _addr.sin_port = htons(_port);
  }
   
  sockaddr_in *addrptr() { return &_addr; }
  socklen_t addrlen()
  {
    return sizeof(_addr);
  }

  string ip() { return _ip; }
  uint16_t port() { return _port; }
  bool operator==(const inetaddr sockin)
  {
    return _ip == sockin._ip && _port == sockin._port;
  }
  sockaddr_in &sockaddr() { return _addr; } // 这里返回引用否则右值无地址可取（sendto）
  string get_userinfo()
  {
    return ip() + " : " + to_string(port());
  }
  ~inetaddr() {}

private:
  sockaddr_in _addr;
  string _ip;
  uint16_t _port;
};